package cg.server.game;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Die Klasse GemischterStapel erzeugt eine zufällig gemischter Farbkartenstapel
 * mit 63 Farbkarten.
 *
 * @author Tim Beer, Christian Friedli
 */
public class GemischterStapel {

    // String array mit den 7 verschieden Farben
    private String[] farben = {"magenta", "orange", "blau", "braun", "gelb", "grau", "gruen"};
    // Array List des Gemischten Stapels
    private List<Farbkarte> GemischterStapel = new ArrayList<Farbkarte>();

    /**
     * Konstruktor des Gemischten Stapels
     */
    public GemischterStapel() {
        //Mit dieser verschachtelten For-Schleife werden alle Farbkarten für das Spiel erstellt
        // erste for-schleife wird 7 mal durchlaufen (weil 7 farben)
        // zweite for-schleife wird 9 mal durchlaufen (9 karten pro farbe)
        for (int i = 0; i < 7; i++) {
            for (int j = 0; j < 9; j++) {

                Farbkarte fk = new Farbkarte(farben[i]);

                GemischterStapel.add(fk);
            }
        }

        //Die ArrayList GemischterStapel wird gemischt...        
        Collections.shuffle(GemischterStapel);
    }

    /**
     * Methode um eine Karte vom Stapel zu nehmen. Die oberste Karte vom Stapel
     * wird zurückgegeben. (Die Einträge im Array rutschen an Index 0 nach)
     *
     * @return Oberste Karte.
     */
    public Farbkarte karteAufnehmen() {
        return GemischterStapel.get(0);
    }

    /**
     * Die Farbe von der obersten Karte wird zurückgegeben. Wird genützt um die
     * Karte auf dem GUI anzuzeigen, bevor sie effektiv vom Stapel genommen
     * wird, um auf ein GameField Kartendeck zu verlegen.
     *
     * @return Farbe der obersten Karte des Stapels.
     */
    public String getFarbeVonAufgenommenerKarte() {
        return GemischterStapel.get(0).getFarbe();
    }

    /**
     * Die oberste Karte vom Stapel wird zurückgegeben. (Die Einträge im Array
     * rutschen an Index 0 nach)
     *
     * @return Oberste Karte.
     */
    public void letzteKarteLöschen() {
        GemischterStapel.remove(0);
    }

    /**
     * Methode legt die zu vor gezogene Karte zurück auf den Stapel und gibt
     * eine neue Karte zurück. Die Methode wird benötigt um jedem Spieler eine
     * anders Farbige Startfarbkarte zurück zu geben.
     *
     * @param Farbkarte zuvor gezogene Farbkarte
     * @return Oberste Karte.
     */
    public Farbkarte neueKarte(Farbkarte AktuelleKarte) {
        int letzteKarte = GemischterStapel.size() - 1;
        Farbkarte Karte = GemischterStapel.get(0);
        GemischterStapel.add(letzteKarte, AktuelleKarte);
        return Karte;
    }

    /**
     * Methode gibt die aktuelle Grösse des Stapel zurück. Wird gebraucht um die
     * letzte Rundekarte auf dem GUI anzuzeigen, wenn der Stapel nur noch 15
     * Karten aufweist.
     *
     * @return stapelGroesse
     */
    public int stapelGroesse() {
        return GemischterStapel.size();
    }
}
